﻿using System;
using System.Runtime.Serialization;

namespace Kyoh.Lib.Component.Arguments
{
    /// <summary>不正な引数が定義、または設定されたことを表します。</summary>
    [Serializable]
    public class InvalidArgumentException : Exception
    {
        /// <summary><see cref="InvalidArgumentException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="invalidity">不正の原因を表す列挙子を指定します。</param>
        public InvalidArgumentException(ArgumentInvalidity invalidity)
        {
            this.Invalidity = invalidity;
        }
        /// <summary><see cref="InvalidArgumentException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="invalidity">不正の原因を表す列挙子を指定します。</param>
        /// <param name="message">エラーを説明するメッセージを指定します。</param>
        public InvalidArgumentException(ArgumentInvalidity invalidity, string message)
            : base(message)
        {
            this.Invalidity = invalidity;
        }
        /// <summary><see cref="InvalidArgumentException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="invalidity">不正の原因を表す列挙子を指定します。</param>
        /// <param name="message">エラーを説明するメッセージを指定します。</param>
        /// <param name="inner">現在の例外の原因を表す例外を指定します。</param>
        public InvalidArgumentException(ArgumentInvalidity invalidity, string message, Exception inner)
            : base(message, inner)
        {
            this.Invalidity = invalidity;
        }
        /// <summary>シリアル化したデータを使用して、<see cref="InvalidArgumentException"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="info">スローされている例外に関するシリアル化済みオブジェクト データを保持している <see cref="SerializationInfo"/></param>
        /// <param name="context">転送元または転送先に関するコンテキスト情報を含んでいる <see cref="StreamingContext"/></param>
        protected InvalidArgumentException(SerializationInfo info, StreamingContext context) : base(info, context) { }

        /// <summary>不正の原因を表す <see cref="ArgumentInvalidity"/> を取得・設定します。</summary>
        public ArgumentInvalidity Invalidity { get { return (ArgumentInvalidity)this.Data["Invalidity"]; } private set { this.Data["Invalidity"] = value; } }
        /// <summary>不正の原因となった引数名を取得または指定します。</summary>
        public string ArgumentName { get { return (string)this.Data["ArgumentName"]; } set { this.Data["ArgumentName"] = value; } }
        /// <summary>不正の原因となったプロパティ名を取得または指定します。</summary>
        public string PropertyName { get { return (string)this.Data["PropertyName"]; } set { this.Data["PropertyName"] = value; } }
    }
}
